package demo04;

/*
 *  递归：指在当前方法内调用方法自身的这种现象
 *  递归的分类：递归分为两种，直接递归和间接递归
 *      直接递归：方法调用方法自身
 *      间接递归：A方法调用B方法，B方法调用C方法，C方法调用A方法
 *  注意事项：
 *      1. 递归一定要有条件限定，保证递归能够停止下来，否则会发生栈内存溢出
 *      2. 在递归中即使有限定条件，但是递归次数不能太多。否则也会发生栈内存溢出
 *      3. 构造方法禁止递归
 *  递归的使用前提：
 *      当调用方法时，方法的主体不变，每次调用方法的参数不同，则可以使用递归
 */
public class Demo01Recursion {
    public static void main(String[] args) {
        // a();
        // b(1);
    }

    /*
     *  构造方法禁止递归
     */
    public Demo01Recursion() {
        // Demo01Recursion(); // 编译报错：构造方法是创建对象使用的，一直递归会导致内存中有无数个该对象，会直接编译报错
    }

    /*
     *  在递归中即使有限定条件，但是递归次数不能太多。否则也会发生栈内存溢出
     */
    private static void b(int i) {
        System.out.println(i);
        if (i == 10000) {
            return; // 结束方法
        }
        b(++i); // java.lang.StackOverflowError 栈内存移除错误！
    }

    /*
     *  递归一定要有条件限定，保证递归能够停止下来，否则会发生栈内存溢出
     */
    private static void a() {
        System.out.println("方法a！");
        a(); // java.lang.StackOverflowError 栈内存移除错误！
    }
}
